﻿using System;
using System.Windows.Forms;
using Agenda.Business;
using Agenda.Model.Entities;
using DDotNet.ORMapping.Exception;

namespace Agenda
{
    public partial class FormAgenda : Form
    {
        public FormAgenda()
        {
            InitializeComponent();
        }
        
        /// <summary>
        /// Configura os Botões da Toolbar
        /// </summary>
        private void SetupToolbar()
        {
            this.toolStripButtonExcluirContato.Visible = (this._RegistrosAgenda.Count > 0);
            this.toolStripButtonSalvarAtual.Visible = (this._RegistrosAgenda.Count > 0);
            this.toolStripButtonAtualizar.Visible = (this._RegistrosAgenda.Count > 0);
            this.toolStripButtonNovoRegistro.Visible = true;
        }

        private void FormAgenda_Load(object sender, EventArgs e)
        {
            // Carrega os Dados
            this.LoadGridData();
        }

        /// <summary>
        /// Preenche a BindSource
        /// </summary>
        private void LoadGridData()
        {
            toolStripButtonAtualizar_Click(null, null);
        }

        private RegistroAgendaCollection _RegistrosAgenda;

        private void toolStripButtonAtualizar_Click(object sender, EventArgs e)
        {
            // Carrega os Registros do Banco de Dados pela Classe de Business
            this._RegistrosAgenda = new RegistroAgendaBusiness().GetAll();
            
            // Adiciona Eventos de Mapeamento da Coleção
            this._RegistrosAgenda.ListChanged += new System.ComponentModel.ListChangedEventHandler(_RegistrosAgenda_ListChanged);
            
            // Configura a DataSource
            this.bindingSource1.DataSource = this._RegistrosAgenda;
        }

        void _RegistrosAgenda_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
        {
            // Formata a Toolbar
            this.SetupToolbar();
        }

        /// <summary>
        /// Retorna o <see cref="RegistroAgenda"/> Atual
        /// </summary>
        private RegistroAgenda RegistroAgendaAtual
        {
            get
            {
                return (RegistroAgenda) this.bindingSource1.Current;
            }
        }

        private void toolStripMenuItemEditarEndereco_Click(object sender, EventArgs e)
        {
            // Cria Objetos
            FormEndereco formEndereco;

            // Verifica se tem Endereço
            if (this.RegistroAgendaAtual.Endereco == null)
            {
                // Inicializa uma Nova Instância do Endereço
                this.RegistroAgendaAtual.Endereco = new EnderecoAgenda();
            }

            // Inicializa o Formulário
            formEndereco = new FormEndereco(this.RegistroAgendaAtual.Endereco);

            // Abre em Dialogo
            formEndereco.ShowDialog();
        }

        private void toolStripButtonSalvarAtual_Click(object sender, EventArgs e)
        {
            // Dispara a Validação do Form para Forçar a Propagação do DataBinding
            this.Validate();
            
            try
            {
                // Atualiza Entidade no Banco de Dados
                new RegistroAgendaBusiness().UpdateDB(this.RegistroAgendaAtual);

                // Notifica o BindingSource para Atualizar os Controles
                this.bindingSource1.CurrencyManager.Refresh();

                // Emite Mensagem
                MessageBox.Show("Contato Salvo com Sucesso", "Atualização de Contato", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (ValidationException ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void toolStripButtonNovoRegistro_Click(object sender, EventArgs e)
        {
            // Adiciona um Novo Item pelo BindingSource
            this.bindingSource1.AddNew();

            // Configura o Foco para o Nome do Contato
            this.textBoxNomeContato.Focus();
        }
        
        private void toolStripButtonExcluirContato_Click(object sender, EventArgs e)
        {
            try
            {
                // Marca Entidade Atual para Exclusão
                RegistroAgenda agenda = this.RegistroAgendaAtual;
                agenda.MarkDeleted();
                
                // Envia para Atualização no Banco de Dados
                new RegistroAgendaBusiness().UpdateDB(agenda);
                
                // Notifica o BindingSource para Atualizar os Controles
                this.bindingSource1.CurrencyManager.Refresh();
                
                // Emite Mensagem
                MessageBox.Show("Contato Excluído com Sucesso", "Exclusão de Contato", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (ValidationException ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void editarTelefonesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // Cria Objetos
            FormTelefone formTelefone;

            // Verifica se tem Telefones
            if (this.RegistroAgendaAtual.Telefones == null)
            {
                // Inicializa uma Nova Instância da Coleção de Telefones
                this.RegistroAgendaAtual.Telefones = new TelefoneCollection();
            }

            // Inicializa o Formulário
            formTelefone = new FormTelefone(this.RegistroAgendaAtual);

            // Abre em Dialogo
            formTelefone.ShowDialog();
        }
    }
}